// 第二版 (来自 underscore 的实现)
var memorize = function(func, hasher) {
    var memoize = function(key) {
        var cache = memoize.cache;
        var address = '' + (hasher ? hasher.apply(this, arguments) : key);
        // console.log(address);
        if (!cache[address]) {
            cache[address] = func.apply(this, arguments);
        }
        return cache[address];
    };
    memoize.cache = {};
    return memoize;
};

var add = function(a, b, c) {
    return a + b + c;
}
// 从这个实现可以看出，underscore 默认使用 function 的第一个参数作为 key
// var memoizedAdd = memorize(add)
// memoizedAdd(1, 2, 3) // 6
// memoizedAdd(1, 2, 4) // 6

// 如果要支持多参数，我们就需要传入 hasher 函数，
// 自定义存储的 key 值。所以我们考虑使用 JSON.stringify
// 如果使用 JSON.stringify，参数是对象的问题也可以得到解决，因为存储的是对象序列化后的字符串
var memoizedAdd = memorize(add, function(){
    var args = Array.prototype.slice.call(arguments);
    // console.log(args);
    return JSON.stringify(args)
})

console.log(memoizedAdd(1, 2, 3)) // 6
console.log(memoizedAdd(1, 2, 4)) // 7

var propValue = function(obj){
    return obj.value
}

var memoizedAdd = memorize(propValue,function(){
    var args = Array.prototype.slice.call(arguments)
    return JSON.stringify(args)}
);

console.log(memoizedAdd({value: 1})) // 1
console.log(memoizedAdd({value: 2})) // 2
